package com.tsystems.services;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

import com.tsystems.dao.PassengerDAO;
import com.tsystems.dao.TicketDAO;
import com.tsystems.entities.Passenger;
import com.tsystems.entities.Ticket;
import com.tsystems.entities.TimeTableElement;

/**
 * 
 * @author 4194
 * 
 *         Класс, который отвечает за все операции производимые над пассажирами.
 */
public class PassengerServices {

	private static PassengerServices instance;

	public static synchronized PassengerServices getInstance() {
		if (instance == null) {
			instance = new PassengerServices();
		}
		return instance;
	}

	private PassengerServices() {
	}

	/**
	 * Метод ищет по логину пользователя и проверяет совпадение пароля. Если
	 * пользователь найден и пароль совпал, то вход в систему выполнен успешно.
	 * 
	 * @param login
	 *            - имя пользователя
	 * 
	 * @param password
	 *            - пароль
	 * 
	 * @return "Вход в систему успешно выполнен" - если пользователь с таким
	 *         логином найден и его пароль совпал, иначе
	 *         -"Неверный пароль или имя пользователя!".
	 */
	public synchronized String login(String login, String password) {
		PassengerDAO passengerDAO = new PassengerDAO();
		Passenger passenger = passengerDAO.getPassenger(login);
		if (passenger != null && passenger.getPassword().equals(password)) {
			return "Вход в систему успешно выполнен";
		}
		return "Неверный пароль или имя пользователя!";

	}

	/**
	 * Регистрирует пользователя, если пользователь с таким именем еще не
	 * зарегистрирован.
	 * 
	 * @param passenger
	 *            - пользователь, которого необходимо зарегистрировать.
	 * 
	 * @return "Поздравляем! Регистрация прошла успешно!" - если регистрация
	 *         прошла успешно, иначе "Такой пользователь уже существует."
	 */
	public synchronized String register(Passenger passenger) {
		PassengerDAO passengerDAO = new PassengerDAO();
		Passenger passengerFound = passengerDAO.getPassenger(passenger
				.getLogin());

		if (passengerFound != null) {
			return "Такой пользователь уже существует.";
		}

		passengerDAO.insert(passenger);
		return "Поздравляем! Регистрация прошла успешно!";
	}

	/**
	 * Удаляет пользователя, если пользователь с таким именем зарегистрирован.
	 * 
	 * @param passenger
	 *            - пользователь, которого необходимо удалить.
	 * 
	 * @return "Удаление пассажира прошло успешно!" - если удаление прошло
	 *         успешно, иначе "Такого пользователя не существует."
	 */
	public synchronized String removePassenger(Passenger passenger) {

		PassengerDAO passengerDAO = new PassengerDAO();
		Passenger passengerFound = passengerDAO.getPassenger(passenger
				.getLogin());

		if (passengerFound == null) {
			return "Такого пользователя не существует.";
		}

		passengerDAO.remove(passengerFound);
		return "Удаление пассажира прошло успешно!";

	}

	/**
	 * Изменяет пользователя, если пользователь с таким именем зарегистрирован.
	 * 
	 * @param passenger
	 *            - пользователь, которого необходимо изменить.
	 * 
	 * @return "Изменение пассажира прошло успешно!" - если изменение прошло
	 *         успешно, иначе "Такого пользователя не существует."
	 */
	public synchronized String editPassenger(Passenger passenger) {

		PassengerDAO passengerDAO = new PassengerDAO();
		Passenger passengerFound = passengerDAO.getPassenger(passenger
				.getLogin());

		if (passengerFound == null) {
			return "Такого пользователя не существует.";
		}

		passengerFound.setName(passenger.getName());
		passengerFound.setSurname(passenger.getSurname());
		passengerFound.setPassword(passenger.getPassword());
		passengerFound.setBirthday(passengerFound.getBirthday());

		passengerDAO.update(passengerFound);
		return "Изменение пассажира прошло успешно!";

	}

	/**
	 * Возвращает весь список пассажиров, который содержится в базе
	 * 
	 * @return список пассажиров
	 */
	public synchronized List<Passenger> viewPassengersBase() {

		PassengerDAO passengerDAO = new PassengerDAO();
		List<Passenger> passengerList = passengerDAO.getPassengerList();
		ArrayList<Passenger> resultList = new ArrayList<Passenger>();
		for (Passenger passenger : passengerList) {
			resultList.add(new Passenger(passenger));
		}

		return resultList;

	}

	/**
	 * Возвращает список пассажиров, зарегистрированных на определенный элемент
	 * расписания
	 * 
	 * @param timeTableElement - элемент расписания
	 * @return список пассажиров.
	 */
	public synchronized List<Passenger> viewPassengersOnTrain(
			TimeTableElement timeTableElement) {
		TicketDAO passengerDAO = new TicketDAO();
		List<Ticket> ticketList = passengerDAO
				.getTicketsByTrain(timeTableElement);
		HashSet<Passenger> passengers = new HashSet<Passenger>();
		for (Ticket ticket : ticketList) {
			passengers.add(ticket.getPassenger());
		}

		return new ArrayList<Passenger>(passengers);

	}

}
